关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)

您所在的位置:网站首页 efi part 红灯 关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)

关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)

2023-07-28 06:24| 来源: 网络整理| 查看: 265

最近在做一个远程控制的模块,其中用到了telnet协议,开始用的是apache-net包的telnetclient,但发现问题不少,比较慢,还有就是判断是否read完毕的问题。后来经过讨论打算实现自己的telnet,于是网址打罗了一番,找了一个,但是bug也不少,就开始封装。具体的telnet我已经发过2篇文章了,这里再发布一个深化封装的telnet实现。

仅供参考,可以在windows和linux上运行。

package baby.net.base; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.util.ArrayList; import org.apache.log4j.Logger; /** * telnet 基本连接类 * * @description * @author weichaofan * @date 2013年10月25日 */ public class TelnetBase { private static final byte SB = (byte) 250;// 子选项开始 private static final byte SE = (byte) 240;// 子选项结束 private static final byte WILL = (byte) 251;// 选项协商 private static final byte WONT = (byte) 252;// 选项协商 private static final byte DO = (byte) 253;// 选项协商 private static final byte DONT = (byte) 254;// 选项协商 private static final byte IAC = (byte) 255;// 数据字节255 private static final byte ECHO = (byte) 1;// 回显 private static final byte IS = (byte) 0;// 是 private static final byte SUPPRESS = (byte) 3;// 抑制继续进行 private static final byte TT = (byte) 24;// 终端类型 private InputStream is; private OutputStream os; private Socket client; private byte[] readBuffer = new byte[20 * 1024]; private int miniReadIntervalMillSec = 3000;// 最短read阻塞间隔时间-毫秒 private int connectTimeout = 1000;// 连接超时时间 private int maxReadTimeout = 5000; public static String[] failTags = { "Failed", "fail", "incorrect" }; public static String[] loginTags = { "$", "#", ">", "ogin", "@" }; public static String[] commondEndTags= { "$", "#", ">"}; public static String[] allTags = { "Failed", "fail", "incorrect", "$", "#", ">", "ogin", "@" }; private String ip; private int port = 23; Logger logger = Logger.getLogger(getClass()); /** * * 打开telnet连接 * * @param ip * @param port *            23 * * @return * * @throws CmdException */ public TelnetBase(String ip) { this(ip, 23); } /** * * 打开telnet连接 * * @param ip * @param port * @return * @throws CmdException */ public TelnetBase(String ip, int port) { this.ip = ip; this.port = port; } /** * 连接 * * @return * @throws Exception */ public String connect() throws Exception { try { client = new Socket(); client.connect(new InetSocketAddress(ip, port), connectTimeout); client.setSoTimeout(miniReadIntervalMillSec);// 设置is的read方法阻塞时间 is = client.getInputStream(); os = client.getOutputStream(); } catch (Exception e) { this.close(); throw new Exception(e); } return readKeyWords("ogin:"); } /** * * 读取回显,并进行telnet协商 * * @return * * @throws IOException */ public String recieveEcho() throws IOException { int len = is.read(this.readBuffer); ArrayList bsList = new ArrayList(); ArrayList cmdList = new ArrayList(); for (int i = 0; i  0) { byte[] writeBuffer = new byte[cmdList.size()]; for (int i = 0; i  0) { byte[] bs = new byte[size]; for (int i = 0; i  0) { str = recieveEcho(); } } //  log(len, cmdList); return str; } private void log(int len, ArrayList cmdList) { logger.debug("read===== "); for (int i = 0; i  0) { logger.debug("write==== "); for (int i = 0; i  *  不包含执行命令中的关键字 * @param cmd * @param keyWords * @return */ public String sendCommand(String cmd) throws Exception { return sendCommand(cmd,false); } /** * 命令中不要包括回车、换行 默认搜索条件为$、#、> *  是否包含执行命令中的关键字 * @param cmd * @param keyWords * @return */ public String sendCommand(String cmd,boolean excludeCommandCheck) throws Exception { os.write((cmd + "\r\n").getBytes()); if(!excludeCommandCheck){ return readKeyWords(cmd,maxReadTimeout,commondEndTags); }else{ return readKeyWords(commondEndTags); } } /** * 命令中不要包括回车、换行 默认搜索条件为$、#、> * 不包含执行命令中的关键字 * @param cmd * @param timeOut * @param keyWords * @return */ public String sendCommand(String cmd, long timeOut) throws Exception { return sendCommand(cmd,timeOut, false); } /** * 命令中不要包括回车、换行 默认搜索条件为$、#、> * 是否包含执行命令中的关键字 * @param cmd * @param timeOut * @param keyWords * @return */ public String sendCommand(String cmd, long timeOut,boolean excludeCommandCheck) throws Exception { os.write((cmd + "\r\n").getBytes()); if(!excludeCommandCheck){ return readKeyWords(cmd,timeOut, commondEndTags); }else{ return readKeyWords(timeOut, commondEndTags); } } /** * 命令中不要包括回车、换行 * * @param cmd * @param timeOut * @param keyWords * @return */ public String sendCmd(String cmd, long timeOut, String... keyWords) throws Exception { return sendCmd(cmd,false,timeOut, keyWords); } /** * 命令中不要包括回车、换行 * * @param cmd * @param timeOut * @param keyWords * @return */ public String sendCmd(String cmd, boolean excludeCommandCheck,long timeOut, String... keyWords) throws Exception { os.write((cmd + "\r\n").getBytes()); if(!excludeCommandCheck){ return readKeyWords(cmd,timeOut, keyWords); }else{ return readKeyWords(timeOut, keyWords); } } /** * * 关闭telnet连接 */ public void close() { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (client != null) { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * * 读取期望值,使用默认超时时间5秒 * * @param keyWords * * @return */ public String readKeyWords(String... keyWords) { return this.readKeyWords(maxReadTimeout, keyWords); } /** * * 读取期望值 * * @param timeOut *            超时时间 * * @param keyWords * * @return * * @throws CmdException */ public String readKeyWords(long timeOut, String... keyWords) { String rv = ""; long nextTime = 0; long endTime = System.currentTimeMillis() + timeOut; do { try { String _rv = this.recieveEcho(); rv += _rv; } catch (IOException e) { nextTime = endTime - System.currentTimeMillis(); } } while (!this.findKeyWord(keyWords, rv) && nextTime >= 0); if (nextTime = 0); if (nextTime  关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)的更多相关文章 Telnet 协议详解

Telnet 协议详解 一.概述 ============================================================ Telnet 协议是 TCP/IP 协议族中 ...

telnet协议的作用详解,以及telnet端口号介绍

转:http://www.ctowhy.com/382.html Telnet协议,工作在TCP/IP协议栈的“应用层”,telnet是一种使用命令行的远程终端管理的协议,可以远程连接到网络设备上,并 ...

Telnet协议详解

转:http://www.cnblogs.com/dazhaxie/archive/2012/06/27/2566054.html 1. 概述 Telnet协议是TCP/IP协议族中的一员,是Inte ...

Telnet协议详解(远程登陆协议)

1. 概述 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议.Telnet协议的目的是提供一个相对通用的,双向的,面向八位字节的通信方法,允许界面终端设备和面向终 ...

【Telnet】使用Telnet协议连接到远程Shell执行脚本

介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: http://www.cnbl ...

Atitit onvif协议获取rtsp地址播放java语言 attilx总结

Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...

telnet协议:简介与安装使用

Telnet简介 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用teln ...

如何在Windows系统上利用Telnet协议连接Linux服务器

Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家 ...

随机推荐 STL__queue_的应用

转:http://hi.baidu.com/xiaotiandm/item/bda34511cf9e99098fbde41a 调用的时候要有头文件: #include ...

智能手机的工业控制应用方案——SimpleWiFi在工业控制领域应用

智能手机的工业控制应用方案——SimpleWiFi在工业控制领域应用    先上图: 现在的智能控制都是基于微控制器,随着智能的手持终端的普及,基于智能终端的控制就会越来越普遍. WIFI便是其中的一 ...

POJ1182 食物链 【并查集变种】

挺简单的 N个元素扩展为 3*N个 i-A i-B i-C A吃B吃C吃A 挑战程序设计的89面 #include #include #i ...

JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue

JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlocki ...

pcduino v2安装opencv2.4.8

安装例如以下包: sudo apt-get install build-essential make cmake libqt4-dev qt4-qtconfig cmake-qt-gui pkg-co ...

Redis启动多端口,运行多实例(转)

使用redis在同一台机器上,启用多个端口,实现多个实例,完成集群的模拟实现. 启动多实例 redis默认启动端口为6379,我们可以使用 --port 来指定多个端口,如下,在linux终端命令: ...

解决:Determining IP Information for eth0 一直停留 无法进入系统

问题场景: vm centos6.4网卡之前一直没异常,可今天启动时一直卡在Determining IP Information for eth0,无法进入系统.网上说了非常多办法,大多都是不着边的说 ...

AIR学习教程(一)

一.AIR的简单介绍 Adobe® AIR™ 为跨操作系统执行时,通过它能够利用现有 Web 开发技术(Adobe® Flash® CS3 Professional.Adobe® Flex™.HTML ...

公司需求知识自学-Oracle的Package的作用及用法

Oracle的Package的作用 简化应用设计.提高应用性能.实现信息隐藏.子程序重载. 1.Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)? 你不觉得把存储过 ...

训练赛 Grouping(强连通分量缩点 + DAG求最长路)

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti ...



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3